package logica;

import java.net.URL;

import javax.ejb.Stateless;
import javax.inject.Inject;

import jms.EnviarMensaje;
import model.Cliente;
import model.Cuenta;
import model.TransferenciaEntrante;
import DAO.CuentaDAO;
import DAO.TransferenciaDAO;
import clienteWS_BCE.Respuesta;
import clienteWS_BCE.SolicitudTransferenciaWS;
import clienteWS_BCE.SolicitudTransferenciaWSService;
import clienteWS_BCE.Transferencia;

@Stateless
public class TransferenciasSalienteValidacion 
{
	//Dependencias
	@Inject
	CuentaDAO ctaDAO;
	@Inject
	EnviarMensaje clienteJMS;
	@Inject
	TransferenciaDAO transDAO;
	
	private  String codigoBanco=utils.DatosBanco.codigoBanco;
	private  String nombreBanco=utils.DatosBanco.nombreBanco;
	
	
	
	public String transferir(Transferencia transferencia)
	{
		System.out.println("Inentando Transferir");
			
		//valida si el saldo de la cuenta origen es suficiente para la transferencia......
		Cuenta cta= ctaDAO.buscar(transferencia.getCtaOrigen());
		//valida que la cuenta origen tenga fondos suficientes para la transferencia
		if(cta.getCtaSaldo().doubleValue() <transferencia.getMonto())
			return "Saldo insuficiente para la transaccion...";
		
		//valida que no se realicen transferencias contra la misma cuenta
		if(transferencia.getBcoNombreDestino().equalsIgnoreCase(nombreBanco))
			if(transferencia.getCtaDestino().equals(transferencia.getCtaOrigen()))
				return "Error Cuenta Origen es igual a la Cuenta Destino en el mismo banco...";

		
		
		transferencia.setBcoCodOrigen(codigoBanco);
		
		//envia la transferencia al banco central y espera la respuesta
		Respuesta r=enviarToBCE(transferencia);
		
		//valida si la respuesta es exitosa manda a debitar el valor transferido y envia el mail de confirmacion
		if(r.getCodigo()==1)
		{
			this.debitar(cta, transferencia);
			this.enviarCorreoConfirmacion(cta.getCliente(),transferencia);
		}	
			
		
		return r.getMensaje();
	}
	
	
	private Respuesta enviarToBCE(Transferencia t)
	{
		SolicitudTransferenciaWSService servicio;
		try {
		servicio = new  SolicitudTransferenciaWSService (new URL("http://192.168.0.92:8081/ModuloBCE/SolicitudTransferenciaWS?wsdl"));
		SolicitudTransferenciaWS cliente=servicio.getSolicitudTransferenciaWSPort();

		return cliente.transferir(t);
		} catch (Exception e) {
			Respuesta rerror=new  Respuesta();
			rerror.setCodigo(0);
			rerror.setMensaje("Problemas para conectarse al BCE");
			e.printStackTrace();
			return rerror;
		}
	}
	
	
	
	public void debitar(Cuenta cta, Transferencia trans )
	{
		
		System.out.println("Debitando de la cuenta "+trans.getMonto());
		TransferenciaEntrante aux=new TransferenciaEntrante (); 
		aux.setBco_cod_origen(trans.getBcoCodOrigen());
		aux.setBco_nombre_destino(trans.getBcoNombreDestino());
		aux.setCta_origen(trans.getCtaOrigen());
		aux.setCta_destino(trans.getCtaDestino());
		aux.setCedula_cliente_destino(trans.getCedulaClienteDestino());
		aux.setCedula_cliente_origen(trans.getCedulaClienteOrigen());
		aux.setMonto(trans.getMonto());
		aux.setTipo_Cuenta(trans.getTipoCuenta());
		aux.setTipo_Transaccion("4"); //saliente
		transDAO.transferirEntrada(aux);

	}
	
	public void enviarCorreoConfirmacion(Cliente cli,Transferencia trans)
	{
		System.out.println("Enviando mail de confirmacion a "+cli.getCliMail());
		clienteJMS.enviarMensaje("Se ha realizado una transferencia desde su cuenta "+trans.getCtaOrigen()+" hacia el banco "+trans.getBcoNombreDestino()+" cuenta #"+trans.getCtaDestino()+" por un monto de "+trans.getMonto(),
								nombreBanco+"Transferencia Enviada",
		cli.getCliMail());	
	}
}
